import uvicorn
from fastapi import FastAPI
from langchain_core.output_parsers import StrOutputParser
from langchain_core.prompts import ChatPromptTemplate
from langserve import add_routes

from langChain.config import model
from langchain_core.messages import SystemMessage, HumanMessage
# 方案一
#  准备提示（prompt）
msg = [
    SystemMessage(content="你是一个翻译官，你需要将下面的内容翻译成英文"),
    HumanMessage(content="你好，我是张三，我今年18岁")
]

# # 直接使用模型来调用
# result = model.invoke(msg)
# print('返回的结果 ： ', result)

# #  创建数据解析器，
# parser = StrOutputParser()
# result = model.invoke(msg)
# result_str = parser.invoke(result)
# print('经过解析器解析后的结果 ： ', result_str)

# #  组合结果解析器，构成链
# parser = StrOutputParser()
# chain = model | parser
# result_str_2 = chain.invoke(msg)
# print(result_str_2)


# # 方案二
# # 定义带变量的模板
# prompt_temp = ChatPromptTemplate.from_messages([
#     ("system", "你是一个翻译官，你需要将下面的内容翻译成{language}"),
#     ("user", "{text}")
# ])
# #  创建数据解析器，
# parser = StrOutputParser()
#
# #  组合结果解析器，构成链
# chain = prompt_temp | model | parser
#
# #  直接使用链来调用
# result_str_2 = chain.invoke({"language": "日语", "text": "你好，我是张三，我今年18岁"})
# print(result_str_2)


# 方案三，使用FastAPI 做成一个服务
#  定义模板
prompt_temp = ChatPromptTemplate.from_messages([
    ("system", "你是一个翻译官，你需要将下面的内容翻译成{language}"),
    ("user", "{text}")
])

#  创建数据解析器，
parser = StrOutputParser()

# 组合 问题模板、结果解析器，构成链
chain = prompt_temp | model | parser


app = FastAPI(title="LangChain Demo", description="LangChain Demo", version="0.1.0")

# 添加路由
add_routes(app, chain, path="/chain")

if __name__ == "__main__":
    #  langchain-demo3:app : 两部分，
    #  第一部分是 Python 模块文件名（即你的代码文件名）；
    #  第二部分是 FastAPI 应用实例的变量名（即 app = FastAPI() 这个对象）
    uvicorn.run('01-简单用例:app', host="127.0.0.1", port=8000, reload=True)
